package controller

// 在同一个文件夹下的go文件需要是同一个包 包名和文件夹名称可以不一致,但是推荐用一样的,方便我们阅读
// go文件推荐使用下划线隔开两个单词而不是驼峰,方法和变量命名用驼峰
import (
	"fmt"
	"go_web_learn/common"
	"go_web_learn/initconf"
	"go_web_learn/model"
	"math/rand"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/gomodule/redigo/redis"
	"gorm.io/gorm"
)

type TestStruct1 struct {
	Name string `json:"name,omit(a)"`
}

func DemoGet1(c *gin.Context) {
	// db := database.GLOBAL_DB
	c.JSON(http.StatusOK, gin.H{
		"name": "tom",
		"age:": 12,
	})
}

func DemoGet2(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"name": "德玛西亚",
		"age:": 33,
	})
}

// ShouldBindQuery和ShouldBindJSON 前者获取到的是?的参数必须要form才可以接收到
func DemoGet3(c *gin.Context) {
	m := &model.User{}
	err := c.Bind(m)
	if err != nil {
		return
	}
	m.SetName("猴子")
	m.PrtName()
	// user := model.User{1, "小明", 18, "他是小明"}
	c.JSON(http.StatusOK, m)
}

func DemoGet4(c *gin.Context) {
	now := time.Now()
	dateStr := now.Format("2006-01-02 15:04:05")
	c.JSON(http.StatusOK, dateStr)
}

func DemoGet5(c *gin.Context) {
	ts1()
	c.JSON(http.StatusOK, "123")
}
func ts1() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("打出的错误为:", err)
		}
	}()
	panic("抛异常了")
}

func DemoGet6(c *gin.Context) {
	db := initconf.DB
	info := model.Userinfo{}
	db.First(&info)
	fmt.Println(info)
	c.JSON(http.StatusOK, info)
}

func DemoGet7(c *gin.Context) {
	db := initconf.DB
	slipUserinfo := []model.Userinfo{}
	userinfo := model.Userinfo{}
	db.Table("userinfos").Select("name, age, created_at").Find(&slipUserinfo)
	db.Table("userinfos").Select("name, age").Find(&userinfo)
	c.JSON(http.StatusOK, slipUserinfo)
}

func DemoGet8(c *gin.Context) {
	db := initconf.DB
	userinfo := model.Userinfo{
		Model: gorm.Model{
			ID:        uint(rand.Intn(1000)),
			CreatedAt: time.Now(),
			UpdatedAt: time.Now(),
		},
		Name: "tom",
		Age:  18,
	}
	userinfo2 := &model.Userinfo{
		Model: gorm.Model{},
		Name:  "123",
		Age:   18,
	}
	fmt.Println(userinfo2)
	db.Table("userinfos").Save(userinfo)
	c.JSON(http.StatusOK, userinfo)
}

func DemoGet9(c *gin.Context) {
	value := c.Query("r")
	initconf.Wredis(func(conn redis.Conn) {
		// 使用+号拼接必须都是字符串类型才行
		conn.Do("set", "gotest1", value+"666")
	})
	// 不转的话 直接输出[113 119 101 114] ASICC码
	i, _ := redis.Int(initconf.Rredis("get", "gotest1"))
	n1 := 11
	n2 := n1 + 2
	fmt.Println(n2)
	time.Sleep(time.Second)
	c.JSON(http.StatusOK, i)
}

func DemoGet10(c *gin.Context) {
	conn := initconf.RedisPool.Get()
	defer conn.Close()
	conn.Do("set", "test001", "001")
	reply, err := conn.Do("get", "test001")
	str, _ := redis.String(reply, err)
	fmt.Println("输出转换前的值and转换后", reply, str)
	fmt.Println(reply)
}

func Path1(c *gin.Context) {
	// 获取自己set进去的参数
	c.Set("u1", "123")
	_u1, _ := c.Get("u1")
	// 获取链接上的参数
	_u2 := c.Query("u2")
	// 获取url路劲上的参数 :u3
	_u3 := c.Param("u3")
	common.ResponseSuccess(c, gin.H{
		"内部set的值为": _u1,
		"链接上的参数":   _u2,
		"路劲上的参数":   _u3,
	})
}

func Path2(c *gin.Context) {
	// 获取自己set进去的参数
	c.Set("u1", "123")
	_u1, _ := c.Get("u1")
	// 获取链接上的参数
	_u2 := c.Query("u2")
	// 获取url路劲上的参数 *id
	_u3 := c.Param("id")
	common.ResponseSuccess(c, gin.H{
		"内部set的值为": _u1,
		"链接上的参数":   _u2,
		"路劲上的参数":   _u3,
	})
}

func Base1(c *gin.Context) {
	c.String(http.StatusOK, "值是: %v", "首页")
}
func Base2(c *gin.Context) {
	c.XML(http.StatusOK, "12321")
}

func DemoGet11(c *gin.Context) {
	var test TestStruct1
	c.JSON(http.StatusOK, test)
}
